package com.cardcaptorsakura.model.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.*;

/**
 * 语音合成请求DTO
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class VoiceSynthesisRequest {

    /**
     * 用户ID
     */
    @NotBlank(message = "用户ID不能为空")
    private String userId;

    /**
     * 要合成的文本
     */
    @NotBlank(message = "合成文本不能为空")
    @Size(max = 4000, message = "文本长度不能超过4000字符")
    private String text;

    /**
     * 声音类型
     */
    private String voice;

    /**
     * 语音速度（0.25-4.0）
     */
    @DecimalMin(value = "0.25", message = "语音速度不能小于0.25")
    @DecimalMax(value = "4.0", message = "语音速度不能大于4.0")
    @Builder.Default
    private Double speed = 1.0;

    /**
     * 音频格式
     */
    @Builder.Default
    private String format = "mp3";

    /**
     * 音调（-20.0到20.0）
     */
    @DecimalMin(value = "-20.0", message = "音调不能小于-20.0")
    @DecimalMax(value = "20.0", message = "音调不能大于20.0")
    @Builder.Default
    private Double pitch = 0.0;

    /**
     * 音量（0.0-1.0）
     */
    @DecimalMin(value = "0.0", message = "音量不能小于0.0")
    @DecimalMax(value = "1.0", message = "音量不能大于1.0")
    @Builder.Default
    private Double volume = 1.0;

    /**
     * 语言代码
     */
    @Builder.Default
    private String language = "zh-CN";

    /**
     * 情感类型
     */
    private String emotion;

    /**
     * 情感强度（0.0-1.0）
     */
    @DecimalMin(value = "0.0", message = "情感强度不能小于0.0")
    @DecimalMax(value = "1.0", message = "情感强度不能大于1.0")
    @Builder.Default
    private Double emotionIntensity = 0.5;

    /**
     * 是否添加背景音乐
     */
    @Builder.Default
    private Boolean addBackgroundMusic = false;

    /**
     * 背景音乐类型
     */
    private String backgroundMusicType;

    /**
     * 背景音乐音量（0.0-1.0）
     */
    @DecimalMin(value = "0.0", message = "背景音乐音量不能小于0.0")
    @DecimalMax(value = "1.0", message = "背景音乐音量不能大于1.0")
    @Builder.Default
    private Double backgroundMusicVolume = 0.3;

    /**
     * 是否启用语音增强
     */
    @Builder.Default
    private Boolean enableEnhancement = false;

    /**
     * 降噪级别（0-3）
     */
    @Min(value = 0, message = "降噪级别不能小于0")
    @Max(value = 3, message = "降噪级别不能大于3")
    @Builder.Default
    private Integer noiseReduction = 1;

    /**
     * 回声消除
     */
    @Builder.Default
    private Boolean echoCancellation = false;

    /**
     * 是否保存到用户历史
     */
    @Builder.Default
    private Boolean saveToHistory = true;

    /**
     * 请求ID（用于追踪）
     */
    private String requestId;

    /**
     * 优先级（1-10，数字越大优先级越高）
     */
    @Min(value = 1, message = "优先级不能小于1")
    @Max(value = 10, message = "优先级不能大于10")
    @Builder.Default
    private Integer priority = 5;

    /**
     * 超时时间（秒）
     */
    @Min(value = 10, message = "超时时间不能小于10秒")
    @Max(value = 300, message = "超时时间不能大于300秒")
    @Builder.Default
    private Integer timeout = 60;

    /**
     * 是否异步处理
     */
    @Builder.Default
    private Boolean async = false;

    /**
     * 回调URL（异步处理时使用）
     */
    private String callbackUrl;

    /**
     * 额外参数
     */
    private java.util.Map<String, Object> extraParams;

    /**
     * 文本预处理选项
     */
    @Builder.Default
    private TextPreprocessingOptions preprocessingOptions = new TextPreprocessingOptions();

    /**
     * 文本预处理选项
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class TextPreprocessingOptions {
        /**
         * 是否移除HTML标签
         */
        @Builder.Default
        private Boolean removeHtmlTags = true;

        /**
         * 是否标准化标点符号
         */
        @Builder.Default
        private Boolean normalizePunctuation = true;

        /**
         * 是否处理数字读音
         */
        @Builder.Default
        private Boolean processNumbers = true;

        /**
         * 是否处理缩写
         */
        @Builder.Default
        private Boolean processAbbreviations = true;

        /**
         * 是否添加停顿
         */
        @Builder.Default
        private Boolean addPauses = false;

        /**
         * 停顿时长（毫秒）
         */
        @Builder.Default
        private Integer pauseDuration = 500;
    }

    /**
     * 获取预估的音频时长（秒）
     */
    public double getEstimatedDuration() {
        if (text == null || text.isEmpty()) {
            return 0.0;
        }
        
        // 基于字符数和语速估算时长
        int charCount = text.length();
        double baseMinutes = charCount / 200.0; // 假设每分钟200字
        double baseDuration = baseMinutes * 60; // 转换为秒
        
        // 根据语速调整
        return baseDuration / (speed != null ? speed : 1.0);
    }

    /**
     * 获取预估的文件大小（字节）
     */
    public long getEstimatedFileSize() {
        double duration = getEstimatedDuration();
        
        // 根据音频格式估算文件大小
        switch (format != null ? format.toLowerCase() : "mp3") {
            case "mp3":
                return (long) (duration * 16000); // 128kbps
            case "wav":
                return (long) (duration * 176400); // 16bit 44.1kHz stereo
            case "opus":
                return (long) (duration * 8000); // 64kbps
            case "aac":
                return (long) (duration * 16000); // 128kbps
            case "flac":
                return (long) (duration * 176400); // 无损压缩
            default:
                return (long) (duration * 16000);
        }
    }

    /**
     * 验证请求参数
     */
    public boolean isValid() {
        return text != null && !text.trim().isEmpty() && 
               userId != null && !userId.trim().isEmpty() &&
               speed != null && speed >= 0.25 && speed <= 4.0 &&
               volume != null && volume >= 0.0 && volume <= 1.0;
    }

    /**
     * 获取支持的音频格式列表
     */
    public static java.util.List<String> getSupportedFormats() {
        return java.util.Arrays.asList("mp3", "wav", "opus", "aac", "flac");
    }

    /**
     * 获取支持的情感类型列表
     */
    public static java.util.List<String> getSupportedEmotions() {
        return java.util.Arrays.asList(
            "neutral",   // 中性
            "happy",     // 快乐
            "sad",       // 悲伤
            "angry",     // 愤怒
            "excited",   // 兴奋
            "calm",      // 平静
            "gentle",    // 温柔
            "serious"    // 严肃
        );
    }
}